//pages/hypk/hypk.js
const common = require("../../../utils/zstz.js");
const permission = require("../../../utils/permission.js");
//获取应用实例
const app = getApp().globalData;
let _options = '', flag = false;

Page({
  /**
   * 页面的初始数据
   */
  data: {
    avatar: '', //我的头像
    name: '', //我的名字
    otherAvatar: '', //对手的头像
    otherName: '--', //对手的名字
    tip: '好友PK',
    id: '', //分享出去时候带的参数
    matchType: '', //匹配类型
    qCataId: '', //题库id 
    cataname: '', //题库名字
    share: 'share', //邀请按钮隐藏和出现
    opsOpenid: '',
    answertime: 10
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    //调用同步方法判断用户
    permission.checkUser(options);
    let that = this;
    wx.showLoading({
      title: '对战初始化中...',
      mask: true
    });
    setTimeout(() => {
      wx.hideLoading({
        complete: function () {
          //无论成功失败，执行初始化数据
          _options = options;
          console.log("options:", options);
          let token = wx.getStorageSync('token'),
            openId = wx.getStorageSync('openid'),
            user = wx.getStorageSync('userInfo');
            //增加邀请方fid和被邀请方fid是否一致验证
            //isDefaultFid = app.fid == options.fid;
          //**************************************************************** 只要用户存在,走的逻辑大致一样
          if (user != null && user != undefined && user != "" && openId) {
            //说明登录成功了,邀请方和被邀请方做的业务逻辑一样//1、建立长链接，等待服务器推送数据，渲染对方的数据//2、渲染自己的数据和一些答题需要的参数
            that.setData({
              name: wx.getStorageSync('userInfo').nickName,
              avatar: wx.getStorageSync('userInfo').avatarUrl,
              matchType: options.matchType,
              qCataId: options.qCataId,
              cataname: options.cataname,
              opsOpenid: options.openid,
              answertime: options.answertime
            });
            let wsUrl = common.wsUrl + 'gaming/' + openId;
            //********************************************************以下是邀请方和被邀请方做的不同的逻辑//options.openid 是链接里面传过来的，openId是拿缓存中自己的，链接中的openid和自己的openid一样，说明是邀请方
            if (that.data.opsOpenid && that.data.opsOpenid == openId) {
              //邀请方发送请求id
              that.getPKID(openId, token);
            } else {
              //说明是被邀请方判断是新用户还是老用户，没有token信息是新用户要从新拿token信息，//判断单位是否和邀请者相同，不同需要重新
              // if (!isDefaultFid) {
              //   that.toLoginPage(options.fid, options.fidEnc);
              //   return;
              // }
              //1、连长链接，2用户信息存库 3,邀请按钮消失
              if (token) {
                that.connectWebsocket(wsUrl, options.id) //建立长链接，此函数里面服务器推数据回来，在渲染对方的数据  
                that.setData({
                  share: 'share' //邀请按钮消失
                })
                that.updateUserInfo(token); //好友信息存库
              } else {
                //重新拿token信息
                wx.request({
                  url: common.baseUrl + 'api/token/getToken?openId=' + openId,
                  method: 'get',
                  data: {
                    fid: app.fid,
                    uid: wx.getStorageSync('cxid'),
                    wxType: app.wxTypes[11].id
                  },
                  success: (res) => {
                    if (res.errMsg == 'request:ok') {
                      wx.setStorageSync('token', res.data.token);
                      that.connectWebsocket(wsUrl, options.id) //建立长链接，此函数里面服务器推数据回来，在渲染对方的数据  
                      that.setData({
                        share: 'share' //邀请按钮消失
                      })
                      that.updateUserInfo(res.data.token); //好友信息存库
                    }
                  }
                })
              }
            }
          } else {
            //说明没有登录，直接跳转到登录页面,传两个参数
            that.toLoginPage(options.fid, options.fidEnc);
          }
        }
      });
    }, 500);
  },

  //保存用户信息 openId，头像，昵称，
  updateUserInfo(token) {
    let openId = wx.getStorageSync('openid'),
      parameter = token + '&wxOpenId=' + openId + '&wxNickName=' + wx.getStorageSync('userInfo').nickName + '&wxAvatar=' + wx.getStorageSync('userInfo').avatarUrl + '&studyFid=' + app.fid + '&wxPhone=' + wx.getStorageSync('phone');
    wx.request({
      url: common.baseUrl + 'user/update?token=' + parameter,
      method: 'get',
      data: {
        fid: app.fid,
        uid: wx.getStorageSync('cxid'),
        wxType: app.wxTypes[11].id
      },
      success: (res) => {
        if (res.data.success) {}
      }
    })
  },

  //邀请发起者页面ajax请求后台分配一个唯一邀请id，32位字符串
  getPKIDs(qCataId) {
    let that = this,
      openId = wx.getStorageSync('openid'),
      token = wx.getStorageSync('token'),
      parameter = openId + '&token=' + token + '&qCataId=' + qCataId,
      url = common.baseUrl + 'game/inviteFriend?openId=' + parameter;
    wx.request({
      url: url,
      data: {
        fid: app.fid,
        uid: wx.getStorageSync('cxid'),
        wxType: app.wxTypes[11].id
      },
      method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT  
      // header: {}, // 设置请求的 header  
      success: res => {
        // console.log(res)
        // if(res.data.success){
        //   that.setData({
        //     id:res.data.id
        //   })
        // }
      }
    });
  },

  //连上长链接
  connect(url) {
    wx.connectSocket({
      url: url,
      data: {},
      method: 'get',
      header: {
        'content-type': 'application/json'
      },
      success: function (res) {},
      fail: function () {},
    });
  },

  //关闭长连接
  cancel() {
    wx.closeSocket(function (res) {
      error = true;
      console.log('手动关闭链接' + error)
    });
  },

  //发送数据函数
  sendMatch(cmd, inviteId) {
    let data = {
      token: wx.getStorageSync('token'),
      cmd: cmd, ///指令名
      openId: wx.getStorageSync('openid'),
      inviteId: inviteId //字符串参数 id
    };
    wx.sendSocketMessage({
      data: JSON.stringify(data),
      success: (res) => {
        console.log('发送消息成功->' + cmd)
      },
      fail: () => {},
    })
    //监听链接打开成功，然后可以做前端向服务器发送信息
  },

  //建立连接里面的各种逻辑
  connectWebsocket(wsUrl, id) {
    let that = this;
    //长连接等待对方用户的信息推送
    that.connect(wsUrl);
    //监听服务器向前端推送双方用户的数据
    wx.onSocketMessage(function (res) {
      var result = JSON.parse(res.data);
      console.log(result)
      if (result.success) {
        that.setData({
          otherName: result.data.wxNickName, //渲染对方昵称
          otherAvatar: result.data.wxAvatar, //渲染对方头像
          tip: '匹配成功' //双方的提示信息都变成匹配成功
        })
        //隔2秒之后，跳转到答题对战页面
        let url = '../pkExam/pkExam?name=' + that.data.otherName + '&avatar=' + that.data.otherAvatar + '&matchType=' + that.data.matchType + '&qCataId=' + that.data.qCataId + '&cataname=' + that.data.cataname + '&answertime=' + that.data.answertime;
        setTimeout(() => {
          that.cancel(); //关闭长连接
          wx.redirectTo({
            url: url
          })
        }, 2000)
      } else {
        ////链接已经失效
        // wx.showToast({
        //   title: '链接已经失效，去首页看看吧',
        //   icon: 'none',
        //   image: '',
        //   duration: 2000,
        //   mask: true,
        //   success: function (res) {
        //   },
        // })
      }
    })
    //监听连接成功
    wx.onSocketOpen(function () {
      //向服务器发送指令，证明匹配上了，游戏准备开始
      console.log(id)
      that.sendMatch("friendGame", id);
    })
  },

  //获取pkId
  getPKID(openId, token) {
    let that = this;
    let wsUrl = common.wsUrl + 'gaming/' + openId,
      parameter = openId + '&token=' + token + '&qCataId=' + that.data.qCataId,
      url = common.baseUrl + 'game/inviteFriend?openId=' + parameter;
    console.log(url)
    wx.request({
      url: url,
      data: {
        fid: app.fid,
        uid: wx.getStorageSync('cxid'),
        wxType: app.wxTypes[11].id
      },
      method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT  
      success: res => {
        console.log(res)
        if (res.data.success) {
          that.setData({
            id: res.data.id, //赋值id
            share: ''
          })
          console.log(that.data.id)
          //连上长链接
          that.connectWebsocket(wsUrl, res.data.id) //建立长链接，此函数里面服务器推数据回来，在渲染对方的数据  
        } else {
          //说明没有用户信息，直接跳转到超星读书登录页，重新去授权用户信息
          wx.showToast({
            title: '用户信息获取失败，请重新授权',
            icon: 'none',
            image: '',
            duration: 2000,
            mask: true,
            success: function (res) {
              wx.navigateTo({
                url: '/pages/login/login?fid=' + app.fid + '&fidEnc=' + app.fidEnc
              })
            },
          })

        }
      },
      fail(err) {
      }
    })
  },

  //未登录：直接跳转到授权页
  toLoginPage(newFid, newFidEnc) {
    //app.allowLocation = true; //已授权位置
    wx.navigateTo({
      url: '/pages/login/login?fid=' + newFid + '&fidEnc=' + newFidEnc,
      success: function () {
        flag = true; //登录成功后置为true,用于重新加载页面
      },
      fail: function () {
        wx.showToast({
          title: '跳转授权页面失败，请返回小程序首页尝试登录！',
          icon: 'none',
          image: '',
          duration: 2000,
          mask: true
        })
      }
    });
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    if (flag) {
      flag = false;
      this.onLoad(_options);
    }
  },

  /**
   * 用户点击右上角分享，分享按钮  分内部自定义和外部分享
   */
  onShareAppMessage: function (res) {
    flag = false;
    let that = this;
    that.setData({
      //分享后设置提示信息为：等待好友接受中...
      //tip:'等待好友接受中'+<text class="dotting"></text>,
      tip: '等待好友接受中...'
    })
    return {
      title: '知识挑战',
      path: '/pages/zstz/hypk/hypk?fid=' + app.fid + '&fidEnc=' + app.fidEnc + '&id=' + that.data.id + '&openid=' + wx.getStorageSync('openid') + '&matchType=' + that.data.matchType + '&qCataId=' + that.data.qCataId + '&cataname=' + that.data.cataname + '&answertime=' + that.data.answertime
    }
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
    this.cancel();
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

})